package partyBrookerHameln;
import java.util.ArrayList;

/**
 * Von der Verwaltungsklasse ausgehend, werden die Grundlegenden Funktionen
 * gesteuert. Sie hält unter anderem die Kundenkartei, die Inventarliste und das
 * Tagesdatum.
 * 
 * @author Robin Haarlammert, Yannick Retzlaff, Hendrik Schulze Brandhoff
 * @version FINAL
 */
public class Verwaltung {

	private ArrayList<Kunde> kundenKartei = new ArrayList<Kunde>();
	private ArrayList<Gegenstand> inventar = new ArrayList<Gegenstand>();
	private Datum aktuellesDatum;
	private int maxKdNr;

	public Verwaltung() {
		aktuellesDatum = new Datum(2014, 12, 19, 23);
		maxKdNr = 1001;
	}

	/**
	 * Stellt das aktuelle Datum um die eingegebenen Stunden weiter.
	 * 
	 * @param h
	 *            Anzahl der vorzustellenden Stunden
	 */
	public void zeitVor(int h) {
		aktuellesDatum.stundevor(h);
	}

	/**
	 * Gibt das Aktuelle Datum zurück.
	 * 
	 * @return Datum Das aktuelle Tagesdatum mit Uhrzeit
	 */
	public Datum getAktuellesDatum() {
		return aktuellesDatum;
	}

	/**
	 * Gibt die Kundenkartei zurück.
	 * 
	 * @return kundenKartei Eine ArrayList mit allen Kunden.
	 */
	public ArrayList<Kunde> getKundenKartei() {
		return kundenKartei;
	}

	/**
	 * Gibt den Bestand zurück.
	 * 
	 * @return inventar Eine ArrayList mit allen verfügbaren Gegenständen.
	 */
	public ArrayList<Gegenstand> getInventar() {
		return inventar;
	}

	/**
	 * Ausgabe in Tabellenform aller verfügbaren Objekte in der Inventarliste.
	 */
	public void verfuegbareObjekteAuflisten() {
		System.out.println("╔════╦═══════════════════════════════════╦═══════╦═════════════╦══════════╦═════════════════╦══════════╗");
		System.out.println("║ObNr║                               Name║Bestand║Verkaufspreis║Leihgebühr║HandlingPauschale║Wertersatz║");
		System.out.println("╠════╬═══════════════════════════════════╬═══════╬═════════════╬══════════╬═════════════════╬══════════╣");
		for (int i = 0; i < inventar.size(); i++) {
			System.out.println("║" + formatBlanks(String.valueOf(i), 4) + inventar.get(i).toString());
		}
		System.out.println("╚════╩═══════════════════════════════════╩═══════╩═════════════╩══════════╩═════════════════╩══════════╝");

	}

	/**
	 * Ausgabe in Tabellenform aller verkäuflichen Objekte in der Inventarliste.
	 */
	public void verkaeuflicheAuflisten() {
		System.out.println("╔════╦═══════════════════════════════════╦═══════╦═════════════╗");
		System.out.println("║ObNr║                               Name║Bestand║Verkaufspreis║");
		System.out.println("╠════╬═══════════════════════════════════╬═══════╬═════════════╣");
		for (int i = 0; i < inventar.size(); i++) {
			if (inventar.get(i).verkaeuflich()) {
				System.out.println("║" + formatBlanks(String.valueOf(i), 4) + inventar.get(i).toStringKauf());
			}
		}
		System.out.println("╚════╩═══════════════════════════════════╩═══════╩═════════════╝");

	}

	/**
	 * Ausgabe in Tabellenform aller verleihbaren Objekte in der Inventarliste.
	 */
	public void verleihbareObjekteAuflisten() {
		System.out.println("╔════╦═══════════════════════════════════╦═══════╦══════════╦═════════════════╦══════════╗");
		System.out.println("║ObNr║                               Name║Bestand║Leihgebühr║HandlingPauschale║Wertersatz║");
		System.out.println("╠════╬═══════════════════════════════════╬═══════╬══════════╬═════════════════╬══════════╣");
		for (int i = 0; i < inventar.size(); i++) {
			if (inventar.get(i).verleihbar()) {
				System.out.println("║" + formatBlanks(String.valueOf(i), 4) + inventar.get(i).toStringLeih());
			}
		}
		System.out.println("╚════╩═══════════════════════════════════╩═══════╩══════════╩═════════════════╩══════════╝");

	}

	/**
	 * Erstellt ein neues Objekt anhand der übergebenen Parameter, wenn es noch
	 * kein Objekt mit dem gleichen Namen gibt. Ist der übergebene Objektname
	 * bereits vorhanden, wird der Bestand dieses Objekts erhöht.
	 * 
	 * @param name
	 *            Einzigartiger Objektname.
	 * @param verkaufspreis
	 *            Einmaliger Verkaufspreis
	 * @param leihgebuehr
	 *            Leihgebühr pro Tag
	 * @param handlingPauschale
	 *            Einmalige Kosten zur Wartung, Reinigung, etc.
	 * @param wertersatzVerlust
	 *            Kosten bei Verlust des Objekts
	 * @param bestand
	 *            Anzahl der aufzunehmenden Objekte
	 */
	public void objektAufnehmen(String name, double verkaufspreis, double leihgebuehr, double handlingPauschale, double wertersatzVerlust, int bestand) {
		boolean vorhanden = false;

		for (int i = 0; i < inventar.size(); i++) {
			if (inventar.get(i).getName().equalsIgnoreCase(name)) {
				vorhanden = true;
				inventar.get(i).setBestand(inventar.get(i).getBestand() + bestand);
				System.out.println("Bestand erfolgreich erhöht!");
			}
		}

		if (!vorhanden) {
			inventar.add(new Gegenstand(name, verkaufspreis, leihgebuehr, handlingPauschale, wertersatzVerlust, bestand));
		}

	}

	/**
	 * Vermindert den Bestand eines Objekts im Inventar und gibt das
	 * rausgenommene Objekt zurück. Wenn das Objekt ein Service ist, wird der
	 * Bestand nicht verändert. Wenn der neue Bestand kleiner oder gleich 0 ist,
	 * wird das Objekt aus der Inventarliste gelöscht.
	 * 
	 * @param i
	 *            Position in der Inventarliste
	 * @param anzahl
	 *            Zahl der rauszunehmenden Objekte
	 * @return Gegenstand Das rausgenommene Objekt mit dem rausgenommenen
	 *         Bestand
	 */
	public Gegenstand objektRausnehmen(int i, int anzahl) {
		if (!inventar.get(i).getService()) {
			inventar.get(i).bestandVerringern(anzahl);
			Gegenstand ausgabe = new Gegenstand(inventar.get(i).getName(), inventar.get(i).getVerkaufsPreis(), inventar.get(i).getLeihGebuehr(), inventar.get(i).getHandlingPauschale(), inventar
					.get(i).getWertersatzVerlust(), anzahl);
			if (inventar.get(i).getBestand() <= 0) {

				inventar.remove(i);

			}
			return ausgabe;
		} else {
			Gegenstand ausgabe = new Gegenstand(inventar.get(i).getName(), inventar.get(i).getVerkaufsPreis(), inventar.get(i).getLeihGebuehr(), inventar.get(i).getHandlingPauschale(), inventar
					.get(i).getWertersatzVerlust(), anzahl);
			return ausgabe;
		}

	}

	/**
	 * Ausgabe in Tabellenform aller Kunden in der Kundenkartei.
	 */
	public void kundenAuflisten() {
		System.out.println("╔════════════╦══════════════════════════════╦════════════════╦════════════╗");
		System.out.println("║KundenNummer║                          Name║Transaktionszahl║GesamtUmsatz║");
		System.out.println("╠════════════╬══════════════════════════════╬════════════════╬════════════╣");
		for (int i = 0; i < kundenKartei.size(); i++) {
			System.out.println(kundenKartei.get(i));
		}

		System.out.println("╚════════════╩══════════════════════════════╩════════════════╩════════════╝");

	}

	/**
	 * Es wird ein neuer Kunde mit dem übergebenem Vor- und Nachnamen, und einer
	 * fortlaufender Kundennummer in die Kundenkartei aufgenommen.
	 * 
	 * @param name
	 *            Der Nachname des neuen Kunden
	 * @param vorname
	 *            Der Vorname des neuen Kunden
	 */
	public void kundenAnlegen(String name, String vorname) {
		// boolean vorhanden = false;

		// for (int i = 0; i < kundenKartei.size(); i++) {
		// if (kundenKartei.get(i).getName().equalsIgnoreCase(name)) {
		// vorhanden = true;
		// System.out.println("Der Kunde existiert bereits!");
		// }
		// }

		// if (!vorhanden) {
		kundenKartei.add(new Kunde(name, vorname, maxKdNr));
		maxKdNr++;
		// }

	}

	/**
	 * Die Methode stellt eine Zeichenkette auf eine bestimmte Länge ein, indem
	 * sie mit vorangestellten Leerzeichen aufgefüllt wird.
	 * 
	 * @param st
	 *            Der zu formatierende String
	 * @param len
	 *            Die Länge des auszugebenen String
	 * @return String Eine mit führenden Leerzeichen verlängerte Zeichenkette
	 */
	public String formatBlanks(String st, int len) {
		String result = String.valueOf(st);
		while (result.length() < len) {
			result = " " + result;
		}
		return result;
	}
}
